名称

portmaster--无需外部数据库或语言即可管理您的ports

简介

Common Flags: [ --force-config -CGHKdgntvw -[B|b] -[f|i]] [[[--packages|-P]|[--packages-only|-PP]] | [--packages-build]] [ --packages-if-newer] [ --delete-build-only] [ --always-fetch] [ --backup-format=<fmt>] [ --package-format=<fmt>] [ --local-packagedir=<path>] [ --packages-local] [ --delete-packages] [ --no-confirm] [ --no-term-title] [ --no-index-fetch] [--index|--index-first|--index-only] [ -m arguments for make] [ -x glob pattern to exclude from building] [ --try-broken] portmaster [Common Flags] full name of port directory in /var/db/pkg portmaster [Common Flags] full path to /usr/ports/foo/bar portmaster [Common Flags] glob pattern of directories from /var/db/pkg portmaster [Common Flags] [ -U|--update-if-newer] Multiple full names or paths from /usr/ports or /var/db/pkg, and/or multiple globs from /var/db/pkg portmaster [Common Flags] . (Use in /usr/ports/foo/bar to build that port) portmaster [Common Flags] -a portmaster --show-work [ -Gv] [ -m args] <single port, as above> portmaster [Common Flags] -o <new port dir in /usr/ports> <installed port> portmaster [Common Flags] [ -R] -r name/glob of port in /var/db/pkg (can be specified more than once) portmaster -l portmaster [--index-only [-t]] -L portmaster --list-origins portmaster [ --force-config|-G] [ -P|-PP] [ -aftv] -F portmaster [ -n|y] [ -b] [ -D|d|--prompt-clean-distfiles] -e name/glob of a single port directory in /var/db/pkg portmaster [ -n|y] [ -b] [ -D|d|--prompt-clean-distfiles] -s portmaster [ -n|y] [ -t] --clean-distfiles portmaster [ -n|y] [ --index|-index-only] --clean-packages portmaster [ -n|y] [ --index|-index-only] [ -v] --check-depends portmaster [ -n|y] [ -v] --check-port-dbdir portmaster -h|--help portmaster --version

上面提到的“glob”模式不是正则表达式。例如: “portmaster perl”将匹配 /var/db/pkg 中符合 /var/db/pkg/perl* 模式的每个port目录名。

快速入门指南

本手册包含了很多关于 portmaster 的宝贵信息,您应该阅读整个手册,以便更好地了解它的工作原理以及您可以选择的选项。但是,为了让您快速入门,请参阅手册末尾的EXAMPLES部分。

描述

portmaster 实用程序是一个用于更新ports的工具。它不使用外部数据库来跟踪您安装的内容。相反,它使用现有的ports基础设施(infrastructure),包括位于 /var/db/pkg 中的基础设施。此工具的重点是保持ports的依赖性跟踪信息最新。这允许您安全地更新特定ports,而无需更新其“上方”的所有端口。在极少数情况下,您确实需要重新编译依赖于您正在更新的ports的ports,可以使用 -r 选项来实现这一点。

默认情况下, portmaster 会更新您在命令行上指定的port。无论是否有新版本,都会发生这种情况。它将首先遍历port及其所有依赖项(如果有的话),通过“make config”接口处理任何port选项。如果您以前从未构建过port,或者 OPTIONS 发生了变化,您将看到一个 OPTIONS 对话框。您可以使用 --force-config 选项为所有ports强制对话框。

在递归依赖关系时,如果您没有使用任何 --packages* 选项,则将在后台启动 make checksum 过程,以验证是否有正确的distfile可用或开始下载新的distfile。如果您使用 ctrl-c 停止 portmaster ,将尝试杀死为此目的启动的子进程。

在检查依赖关系时,如果ports设置了 CONFLICTS (冲突),它们将与您安装的ports进行比较,如果您已经拥有正在构建的ports所需的依赖关系的替代版本,则将使用它来代替默认依赖关系。

当配置和依赖性检查阶段结束时,将向用户显示将要安装和/或升级的ports列表,并要求用户在继续之前批准。这种行为可以通过 --no-confirm 选项来抑制。

如果依赖性检查没有找到需要更新的port,则在构建命令行上指定的port之前,将跳过该步骤。除了这种优化之外,有关最新依赖关系的信息、为交互模式构建哪些ports的选择以及为 make config 已经访问的ports都会被缓存,以提高性能并防止重复工作。

在遍历依赖关系时,如果port标记为 IS_ INTERACTIVE ,则将标记此port。在没有此通知的情况下,在正常情况下,port开始构建后不需要用户交互。如果使用 --prompt-clean-distfiles ,则在构建port之后,将出现一个关于删除过时distfiles的问题。 -d 选项可用于在每次成功升级port后删除过时的distfiles。 -D 选项用于禁止删除过时的distfiles,现在已成为默认选项。有许多 --packages* 选项可以节省通常用于构建port的时间。对安装速度和最大性能之间的合理平衡感兴趣的用户应该考虑使用 --packages-build 选项,也许可以与 --delete-build-only 选项结合使用。

如果在更新现有port时没有指定 -B 选项,则将在调用 pkg-delete(8) 之前创建备份包。如果您使用的是 -b 选项,则可以在 PACKAGES 环境变量指定的目录(通常是 /usr/ports/packages)中名为 portmaster-backup 的目录中找到这些包。如果没有指定 -b 选项,则一旦成功安装了新版本的port,备份包将被删除。如果安装因任何原因失败,将打印一条有用的消息,以及在哪里找到备份包的说明。

构建port后,如果使用了 -w 选项,则旧port安装的所有共享库(如果有的话)都将保存到 /usr/local/lib/compat/pkg 。安装后,如果有任何新文件与 /usr/local/lib/compat/pkg 中的文件同名,则旧文件将被删除,ldconfig(8) 将通过 /etc/rc.d/ldconfig 运行。

在构建新port之后,但在安装之前,将检查运行时依赖关系,以确保它们是最新的。如果使用 -g 选项,将为新版本(或新安装的版本)创建一个包。

安装port或使用 --check-depends 选项时,如果有其他port依赖于此port,则依赖port +CONTENTS 文件和新port的 +REQUIRED_BY 文件将被更新。

成功安装后,将显示已安装的任何 pkg-message 文件以及所执行工作的摘要。如果使用了 --delete-build-only 选项,则将删除在当前运行 portmaster AND期间安装的、在此运行期间仅被列为构建依赖项的包。

如果在此过程中出现问题(例如,port构建失败,port标记为 BROKEN ),portmaster 将报告如上所述成功完成的任何工作,然后退出。

人们经常问这样一个问题:“为什么不可能继续使用没有错误的port?”答案是(不幸的是) portmaster 不是无所不知的,无法猜测用户希望对这个问题有什么解决方案。因此,需要人工干预。

选项

选项如下:

Common Flags(通用标志)

Features(特征)

ENVIRONMENT(环境)

PACKAGES 变量指向的目录(默认为 /usr/ports/packages)将用于存储新的和备份的包。当为 -g 选项使用 make package 时,ports基础设施将把包存储在 ${PACKAGES}/All 中,即 PKGREPOSITORY 。使用 −b 选项时, portmaster 将其备份包存储在 ${PACKAGES}/portmaster-backup 中,以便您可以创建备份包和新安装port的包,即使它们的版本相同。

使用 --packages* 选项时,包文件将下载到 ${PACKAGES}/portmaster-downloadportmaster 将尊重 PACKAGESITEPACKAGEROOT (默认为 http://ftp.freebsd.org )变量。 portmaster 试图以与 pkg-add(8) 相同的方式使用这两个变量。

UPGRADE_TOOL 变量设置为“portmaster”,UPGRADE_PORTUPGRADE_PORT_VER 变量设置为要替换的现有包的完整包名称字符串和版本(如果有的话)。

使用 --index-only 选项时, PACKAGES 变量必须设置为超级用户具有写入权限的目录。其他有用的变量包括:

环境变量默认值
PORTSDIR/usr/ports
MASTER_SITE_INDEXhttp://www.FreeBSD.org/ports/
FETCHINIDEXfetch -am -o
INDEXDIR$PORTSDIR 或 $TMPDIR(对于 --index-only
INDEXFILE根据FreeBSD版本自动

如果您在包构建中使用非标准 OPTIONS 设置,并希望在没有ports树的情况下使用 --index-only 选项,则必须生成自己的 INDEX 文件,以便依赖关系匹配。

如果你想在每个port的基础上自定义你的构建环境,你可能想看看 /usr/ports/ports-mgmt/portconf

要记录 portmaster 采取的操作以及日期/时间戳,您可以在rc文件中使用要登录的文件的完整路径定义 PM_LOG 。如果使用 sudo(8) 运行 portmaster (见下文),则应确保该文件可由无特权用户写入。

默认情况下,portmaster 在更新期间运行 pkg-delete(8) 之前,会创建已安装ports的备份包。如果该包创建失败,则将其视为严重错误,并提示用户。但是,对于 portmaster 的脚本使用,这可能是一个问题。在用户绝对确定缺少备份包不应该是致命错误的情况下,可以将 PM_IGNORE_FAILED_BACKUP_PACKAGE 定义为rc文件中的任何值。

对于那些希望确保特定port始终编译而不是从包中安装的人来说,可以在 make(1) 环境中定义 PT_NO_INSTALL_PACKAGE 变量,如果使用 /usr/ports/ports-mgmt/portconf ,则可以在 /usr/local/etc/ports.conf 中定义,或者在 /etc/make.conf 中定义。此设置与 -PP/--packages-only 选项不兼容。

文件

rc

/usr/local/etc/portmaster.rc

$HOME/.portmasterrc

可选的系统和用户配置文件。可以在这些文件中指定脚本的 getopts 例程中设置的变量,以启用这些选项。这些文件将由父 portmaster 进程读取,其中的所有变量都将被导出。如果 portmaster.rc 文件与 portmaster 脚本本身放置在同一目录中,则将按上述方式读取它。

/var/db/pkg/*/+IGNOREME

如果已安装的ports存在此文件,则会发生以下情况:

  1. 无论出于何种目的,该port都将被忽略。

    这包括依赖关系更新,即使 /usr/ports 中没有该port的目录,并且 /usr/ports/MOVED 中也没有该port条目。如果使用 -v 选项,则会提到port被忽略的事实。

  2. 如果使用 −L 选项,并且存在新版本,则会提到 +IGNOREME 文件的存在。

  3. 如果您定期更新port,或者正在使用 -a 选项,系统会询问您是否仍要更新port。

/var/db/pkg/*/PM_UPGRADE_DONE_FLAG

向包含 −R 选项的后续 -a-f-r 运行指示port已经重建,因此如果它是最新的,可以安全地忽略它。

/tmp/port_log-*

如果使用了 -H 选项,但安装或升级不成功,则构建和安装的结果将保存在此文件中。在您的环境中适当替换 TMPDIR 的值。

退出状态

成功时,portmaster 实用程序退出 0 ,如果发生错误,则退出 >0

高级功能:SU_CMD

ports基础设施对作为无特权用户执行各种操作的支持有限。它通过定义SU_CMD来实现这一点,SU_CMD通常是 su(1) 。为了支持作为无特权用户对ports进行完全管理,仅在必要时升级为“root”权限,portmaster可以使用 sudo(1) 来处理升级的权限。要实现这一点,您必须配置以下目录,以便无特权用户可以访问它们:

  1. WRKDIRPREFIX —— 这通常设置为 /usr/ports/category/port/work

    但是,建议您在ports树之外配置另一个目录,供无特权用户访问,并将此变量分配给 /etc/make.conf 中的该值。

  2. DISTDIR —— 通常设置为 /usr/ports/distfiles

    可以安全地设置此目录供无特权用户访问,也可以如上所述指定新目录。

  3. TMPDIR —— 通常为 /tmp

    但如果需要,也可以设置为shell环境中的另一个目录。

进一步假设以下目录将由root拥有:

/var/db/pkg

/var/db/ports

LOCALBASE —— 通常为 /usr/local

PACKAGES —— 通常为 /usr/ports/packages

PKGREPOSITORY —— 通常为 ${PACKAGES}/All

然后,您需要安装并配置 sudo(1) 。这可以通过 /usr/ports/security/sudo 轻松完成。然后,您需要在 /usr/local/etc/portmaster.rc 文件或 $HOME/.portmasterrc 文件中定义 PM_SU_CMD 。例如:

您也可以选择定义 PM_SU_VERBOSE 选项,以便在每次 portmaster 使用 PM_SU_CMD 时通知您。如果您正在尝试使用 sudo(1) 以外的工具来处理权限升级,这尤其有用,尽管目前 sudo(1) 是唯一受支持的选项。

请注意:您无法使用此方法升级 sudo(1) port本身。

示例

以下是 portmaster 命令的典型用法示例:

完成后,您可能希望再次运行 --clean-distfiles[-y] 。您可能还想考虑在安装新port时使用 --force-config 选项。

或者,您可以使用 portmaster −a −f −D 对ports进行“就地”更新。如果该进程因任何原因中断,您可以使用 portmaster −a −f −D −R 来避免重建在以前运行中已经重建的ports。但是,首选第一种方法(删除所有内容并重新安装)。

参阅

make(1), su(1), pkg(7), ports(7), ldconfig(8), pkg(8), pkg-add(8), pkg-delete(8), sudo(8)

作者

本手册页由Doug Barton撰写 dougb@FreeBSD.org